package cn.coconet.clothingguide.agent;

import cn.coconet.clothingguide.model.CustomChatModel;
import cn.coconet.clothingguide.model.CustomChatResponse;
import cn.coconet.clothingguide.tool.ClothingTool;
import dev.langchain4j.data.message.ChatMessage;
import dev.langchain4j.data.message.UserMessage;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

@Component
public class ClothingGuideAgent {

    // 直接持有自定义模型实例（不依赖ChatModel接口）
    private final CustomChatModel customChatModel;
    // 对话记忆（手动管理）
    private final MessageWindowChatMemory chatMemory;
    // 工具类（如需调用工具，手动处理）
    private final ClothingTool clothingTool;

    @Autowired
    public ClothingGuideAgent(ClothingTool clothingTool,
                             @Value("${custom.model.api-url}") String modelApiUrl,
                             @Value("${custom.model.api-key}") String apiKey) {
        this.clothingTool = clothingTool;
        // 初始化自定义模型
        this.customChatModel = new CustomChatModel(modelApiUrl, apiKey);
        // 初始化对话记忆（保留最近10条消息）
        this.chatMemory = MessageWindowChatMemory.withMaxMessages(10);
    }

    /**
     * 对外提供对话接口：直接调用自定义模型的chat方法
     */
    public String getReply(String userInput) {
        // 1. 将用户输入转为ChatMessage并存入记忆
        ChatMessage userMessage = UserMessage.from(userInput);
        chatMemory.add(userMessage);
        
        // 2. 获取完整对话历史（从记忆中读取）
        List<ChatMessage> messages = new ArrayList<>(chatMemory.messages());
        
        // 3. 调用工具（如需）：此处示例直接调用，实际可根据用户输入判断是否需要调用
        //String toolResult = clothingTool.queryClothing(null, null, null, null);
        //if (!toolResult.isEmpty()) {
            // 将工具结果作为系统消息添加到对话历史
        //    messages.add(UserMessage.from("工具查询结果：" + toolResult));
        //}
        
        // 4. 调用自定义模型的chat方法（使用自定义返回值）
        CustomChatResponse response = customChatModel.chat(messages);
        
        // 5. 处理响应并更新记忆
        if (response.isSuccess()) {
            chatMemory.add(response.getMessage()); // 将模型回应存入记忆
            return parseMessage(response.getMessage());
        } else {
            return "错误：" + parseMessage(response.getMessage());
        }
    }

    /**
     * 解析ChatMessage，提取文本内容
     */
    private String parseMessage(ChatMessage message) {
        return message.toString()
                .replace("UserMessage[", "")
                .replace("SystemMessage[", "")
                .replace("]", "")
                .trim();
    }
}